#pragma once

#include "RBTree.h"

namespace ltw
{
    template<class K,class V>
    class map
    {
        struct MapKeyOfT
        {
            const K& operator()(const pair<K,V>& kv)
            {
                return kv.first;
            }
        };
    public:
        typedef typename RBTree<K,pair<const K,V>,MapKeyOfT>::Iterator iterator;
        typedef typename RBTree<K,pair<const K,V>,MapKeyOfT>::Const_Iterator const_iterator;

        iterator begin()
        {
            return _t.Begin();
        }

        iterator end()
        {
            return _t.End();
        }

        const_iterator begin()const
        {
            return _t.Begin();
        }

        const_iterator end()const
        {
            return _t.End();
        }

        pair<iterator,bool> insert(const pair<K,V>& kv)
        {
            return _t.Insert(kv);
        }

        iterator find(const K& key)
        {
            return _t.Find(key);
        }

        V& operator[](const K& key)
        {
            pair<iterator,bool> ret = insert({key,V()});
            return ret.first->second;
        }

    private:
        RBTree<K,pair<const K,V>,MapKeyOfT> _t;
    };
    void test_map()
    {
        map<string,string> dict;
        dict.insert({"sort","排序"});
        dict.insert({"left","左边"});
        dict.insert({"right","右边"});
        dict["left"] = "right->hahaha";

        for(const auto& e:dict)
        {
            cout << e.first << " " << e.second << endl;
        }
        cout << endl;
        map<string,string>::iterator it = dict.begin();
        while(it != dict.end())
        {
            // it->first += 'x';
            it->second += 'x';
            cout << it->first << " : " << it->second << endl;
            ++it;
        }
        cout << endl;
    }
}